babl: fix icc matrix profile fast paths
authorØyvind Kolås <pippin@gimp.org>
Tue, 30 Jan 2018 15:35:28 +0000 (16:35 +0100)
committerØyvind Kolås <pippin@gimp.org>
Tue, 30 Jan 2018 15:37:56 +0000 (16:37 +0100)
For core members, babl relies on shared data layout between fish and
conversion to be able to do dispatch, and have source/target match -
though only for simple fishes.

The ICC fast path conversions also used the user data - but directly
instead of throug the argument, changing this makes the matrix and
luts work again - and let the conversions be used.

babl/babl-fish-path.c
babl/babl-fish.h
babl/babl-space.c

index 54e9ee40a55763e9f59d7cd6b4125ccad35120f7..c5aca9b657c56ee59374903a6861dfbe3f4fa3fa 100644 (file)
@@ -697,7 +697,7 @@ _babl_fish_rig_dispatch (Babl *babl)
             /* lift out conversion from single step conversion and make it be the dispatch function
              * itself
              */
-            babl->fish.data = &babl->fish_simple.conversion->data;
+            babl->fish.data     = &(babl->fish_simple.conversion->data);
             babl->fish.dispatch = babl->fish_simple.conversion->dispatch;
           }
         else
index a26a0322d9252cea69edfa078aa9b5e7b2efc8e0..db4e06f53c28c7498cbc4fd993fe832a702b7ffa 100644 (file)
@@ -47,6 +47,10 @@ typedef struct
 {
   BablFish         fish;
   BablConversion  *conversion;
+  double     cost;   /* number of  ticks *10 + chain_length */
+  int        source_bpp;
+  int        dest_bpp;
+  void      *foo;
 } BablFishSimple;
 
 
index 6794c2c14ee399b810776cf609137e9d39bc703c..b5557fbd7030ea9fcff3fe055514c691f3765c7a 100644 (file)
@@ -575,12 +575,12 @@ static void prep_conversion (const Babl *babl)
 
 
 static inline void
-universal_nonlinear_rgba_converter (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples)
+universal_nonlinear_rgba_converter (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples, void *data)
 {
   const Babl *source_space = babl_conversion_get_source_space (conversion);
   const Babl *destination_space = babl_conversion_get_destination_space (conversion);
 
-  float * matrixf = conversion->conversion.data;
+  float * matrixf = data;
   float *rgba_in = (void*)src_char;
   float *rgba_out = (void*)dst_char;
 
@@ -592,10 +592,10 @@ universal_nonlinear_rgba_converter (const Babl *conversion,unsigned char *src_ch
 }
 
 static inline void
-universal_nonlinear_rgb_linear_converter (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples)
+universal_nonlinear_rgb_linear_converter (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples, void *data)
 {
   const Babl *source_space = babl_conversion_get_source_space (conversion);
-  float * matrixf = conversion->conversion.data;
+  float * matrixf = data;
   float *rgba_in = (void*)src_char;
   float *rgba_out = (void*)dst_char;
 
@@ -605,11 +605,11 @@ universal_nonlinear_rgb_linear_converter (const Babl *conversion,unsigned char *
 }
 
 static inline void
-universal_nonlinear_rgba_u8_converter (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples)
+universal_nonlinear_rgba_u8_converter (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples, void *data)
 {
   const Babl *destination_space = conversion->conversion.destination->format.space;
 
-  float * matrixf = conversion->conversion.data;
+  float * matrixf = data;
   float * in_trc_lut = matrixf + 9;
   int i;
   uint8_t *rgba_in_u8 = (void*)src_char;
@@ -643,9 +643,9 @@ universal_nonlinear_rgba_u8_converter (const Babl *conversion,unsigned char *src
 
 
 static inline void
-universal_rgba_converter (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples)
+universal_rgba_converter (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples, void *data)
 {
-  float *matrixf = conversion->conversion.data;
+  float *matrixf = data;
   float *rgba_in = (void*)src_char;
   float *rgba_out = (void*)dst_char;
 
@@ -653,9 +653,9 @@ universal_rgba_converter (const Babl *conversion,unsigned char *src_char, unsign
 }
 
 static inline void
-universal_rgb_converter (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples)
+universal_rgb_converter (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples, void *data)
 {
-  float *matrixf = conversion->conversion.data;
+  float *matrixf = data;
   float *rgb_in = (void*)src_char;
   float *rgb_out = (void*)dst_char;
 
@@ -664,11 +664,11 @@ universal_rgb_converter (const Babl *conversion,unsigned char *src_char, unsigne
 
 
 static inline void
-universal_nonlinear_rgb_u8_converter (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples)
+universal_nonlinear_rgb_u8_converter (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples, void *data)
 {
   const Babl *destination_space = conversion->conversion.destination->format.space;
 
-  float * matrixf = conversion->conversion.data;
+  float * matrixf = data;
   float * in_trc_lut = matrixf + 9;
   int i;
   uint8_t *rgb_in_u8 = (void*)src_char;
@@ -731,11 +731,11 @@ static inline void babl_matrix_mul_vectorff_buf4_sse2 (const float *mat,
 
 
 static inline void
-universal_nonlinear_rgba_converter_sse2 (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples)
+universal_nonlinear_rgba_converter_sse2 (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples, void *data)
 {
   const Babl *source_space = babl_conversion_get_source_space (conversion);
   const Babl *destination_space = babl_conversion_get_destination_space (conversion);
-  float * matrixf = conversion->conversion.data;
+  float * matrixf = data;
   float *rgba_in = (void*)src_char;
   float *rgba_out = (void*)dst_char;
 
@@ -748,9 +748,9 @@ universal_nonlinear_rgba_converter_sse2 (const Babl *conversion,unsigned char *s
 
 
 static inline void
-universal_rgba_converter_sse2 (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples)
+universal_rgba_converter_sse2 (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples, void *data)
 {
-  float *matrixf = conversion->conversion.data;
+  float *matrixf = data;
   float *rgba_in = (void*)src_char;
   float *rgba_out = (void*)dst_char;
 
@@ -758,11 +758,11 @@ universal_rgba_converter_sse2 (const Babl *conversion,unsigned char *src_char, u
 }
 
 static inline void
-universal_nonlinear_rgba_u8_converter_sse2 (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples)
+universal_nonlinear_rgba_u8_converter_sse2 (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples, void *data)
 {
   const Babl *destination_space = conversion->conversion.destination->format.space;
 
-  float * matrixf = conversion->conversion.data;
+  float * matrixf = data;
   float * in_trc_lut = matrixf + 9;
   int i;
   uint8_t *rgba_in_u8 = (void*)src_char;
@@ -793,11 +793,11 @@ universal_nonlinear_rgba_u8_converter_sse2 (const Babl *conversion,unsigned char
 }
 
 static inline void
-universal_nonlinear_rgb_u8_converter_sse2 (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples)
+universal_nonlinear_rgb_u8_converter_sse2 (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples, void *data)
 {
   const Babl *destination_space = conversion->conversion.destination->format.space;
 
-  float * matrixf = conversion->conversion.data;
+  float * matrixf = data;
   float * in_trc_lut = matrixf + 9;
   int i;
   uint8_t *rgb_in_u8 = (void*)src_char;
@@ -828,10 +828,10 @@ universal_nonlinear_rgb_u8_converter_sse2 (const Babl *conversion,unsigned char
 
 
 static inline void
-universal_nonlinear_rgb_linear_converter_sse2 (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples)
+universal_nonlinear_rgb_linear_converter_sse2 (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples, void *data)
 {
   const Babl *source_space = babl_conversion_get_source_space (conversion);
-  float * matrixf = conversion->conversion.data;
+  float * matrixf = data;
   float *rgba_in = (void*)src_char;
   float *rgba_out = (void*)dst_char;